[bits 32]

extern exit

test:
    push $ ; 比如刻意制造一个错误指令，将当前位置地址（$表示当前位置）入栈，这就改变了栈顶正确的返回地址了
    ret ; 因为上一条改变了栈顶地址，这里只机械的将栈顶元素返回给eip，就只调回上一条了，这样就构成了死循环

global main
main:
    ; push 5
    ; push eax
    ; pop ebx
    ; pop ecx
    ; mov eax, 1
    ; mov ebx, 2
    ; mov edx, 4
    ; pusha
    ; mov eax, 55
    ; popa
    call test
    push 0 ; 传递参数
    call exit

; 编译方式 nasm -f elf32 -g test_call_stack.asm -o test_call_stack.o  生成可重定位文件
; 然后 gcc -m32 -g -static test_call_stack.o -o test_call_stack.out 生成可执行文件
; 调试 gdb test_call_stack.out